package com.pengtu.gsj.service.impl.check;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.lang.StringUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.pengtu.gsj.entity.app.Attachment;
import com.pengtu.gsj.service.check.DownService;
import com.pengtu.gsj.utils.ConfigUtils;
import com.pengtu.gsj.utils.ConverPdfUtils;
import com.pengtu.gsj.utils.FileUtils;
import com.pengtu.gsj.utils.FreemarkerUtils;
import com.pengtu.gsj.utils.MultiPdf2OneUtils;
import com.pengtu.gsj.utils.WordUtils;
import com.pengtu.gsj.utils.ZipUtils;
import com.pengtu.gsj.utils.web.SpringMvcUtils;

@Transactional
@Service
public class DownServiceImpl implements DownService{

	/**
	 * 一键下载 ：
	 * 1.利用模板生成检查表的word文档  压缩到指定的压缩包下
	 * 2.将相关的附件全部拷贝至某个文件夹中  然后压缩到指定的压缩包下
	 * 3.利用文件目录 生成卷内文件目录临时word文档，并转换成pdf
	 * 4.将检查表的word文档转换成pdf文件
	 * 5.将检查表word转成的pdf文件、卷内文件目录word转pdf文件、文件列表中已经的pdf文件 合并成一个总的pdf文件
	 * 6.将合并的pdf文件添加到指定的压缩包下
	 * 7.删除过程中的临时文件
	 * downWordAndZip: 
	 * 适用:检查表的一键下载  包括word文件的生成及文件的打包
	 * @param checkSubmoduleName 具体检查子模块的名称 eg：小修保养
	 * @param checkModuleName 日常监管中模块的名称  eg：养护管理
	 * @param templateName
	 * @param map
	 * @return
	 * @throws Exception 
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("unchecked")
	@Override
	public ResponseEntity<byte[]> downWordAndZip(String checkSubmoduleName,
			String checkModuleName, String tableName, String templateName,
			Map<String, Object> map) throws Exception {
		//上下文
		ServletContext context = SpringMvcUtils.getServletContext();
		//系统临时目录及定义导出临时zip文件的地址； 随机数是为了防止同一时间导出同一检查表导致文件名相同而出现的异常
		String systemPath = System.getProperty("java.io.tmpdir")+"zipTemp\\"+System.currentTimeMillis()+"\\";
		//解决内容为空时文件名缺省
		if (StringUtils.isEmpty(checkModuleName)) {
			checkModuleName = "日常监管";
		}
		if (StringUtils.isEmpty(checkSubmoduleName)) {
			checkSubmoduleName = "检查模块";
		}
		if (StringUtils.isEmpty(tableName)) {
			tableName = "检查表";
		}
		//将数据填充到map中  供模板中使用
		map.put("checkModuleName", checkModuleName);
		map.put("checkSubmoduleName", checkSubmoduleName);
		
		String wordFileName = systemPath+tableName+".doc";
		String wordConverPdfPath = systemPath+tableName+"word.pdf";
		String copyFilePath = systemPath+tableName+"相关文件\\";
		String mergePdfPath = systemPath+tableName+".pdf";
		String fileDirectoryPath = systemPath+tableName+"卷内文件目录.doc";
		String fileDirectoryPdfPath = systemPath+tableName+"卷内文件目录.pdf";
		//卷内文件目录表格相关参数
		int[] widths = {8,10,15,51,8,8};
        List<String> headTr = new ArrayList<String>();
        headTr.add("序号");
        headTr.add("责任者");
        headTr.add("文号");
        headTr.add("文件标题（内容）");
        headTr.add("页码");
        headTr.add("备注");
		
		
		//如果文件目录不存在就创建
		FileUtils.createFolder(copyFilePath);
		if (StringUtils.isNotEmpty(tableName) && !tableName.equals(checkSubmoduleName)) {
			checkSubmoduleName = checkSubmoduleName + "-" + tableName;
		}
		String lastZipDestPath = systemPath+checkModuleName+"_"+checkSubmoduleName+".zip";
		String rootPath = ConfigUtils.getConfig("attachment.path");
		
		//利用模板生成word文件
		FreemarkerUtils.createDocByTemplate(context, templateName, wordFileName, map);
		
		String defaultPdfPath = ConfigUtils.getConfig("attachment.path");
		String switchPdfPath = ConfigUtils.getConfig("pdf.path");
		List<InputStream> inputStreams = new ArrayList<InputStream>();
		OutputStream outputStream = new FileOutputStream(mergePdfPath);
		//将文件列表中是pdf文件或者能转成pdf文件的文件添加到文件流中  去掉重复文件
		List<String> fileMd5 = new ArrayList<String>();
		
		List<Attachment> attachments = (List<Attachment>)map.get("att");
		List<List<String>> contents = new ArrayList<List<String>>();
		List<String> trContent = null;
		
		int temp = 1;
		for (Attachment attachment : attachments) {
			File file = null;
			trContent = new ArrayList<String>();
			//将规章制度和其他类型文件拷贝到指定文件夹下
			FileUtils.copy(rootPath+attachment.getFullPath(), copyFilePath, false);
			
			//将文件流添加到集合中  合并文件时使用
			if (!fileMd5.contains(attachment.getFileMD5())) {
				fileMd5.add(attachment.getFileMD5());
				if ("pdf".equals(attachment.getType())) {
					 file = new File(defaultPdfPath + attachment.getPdfPath());
				} else if (StringUtils.isNotEmpty(attachment.getPdfPath())) {
					file = new File(switchPdfPath + attachment.getPdfPath());
				}
				if (file != null && file.exists()) {
					inputStreams.add(new FileInputStream(file));
					//将文件的相关属性记录在集合中
					trContent.add(attachment.getUploadPerson());
					trContent.add(attachment.getFileNo());
					trContent.add(attachment.getUpfileFileName());
					//如果得到的页码分别为 5 5 5 5  则显示的时候  显示值分别为： 1 6 11 16
					trContent.add(String.valueOf(temp));
					temp += MultiPdf2OneUtils.getFilePage(new FileInputStream(file));
					trContent.add(attachment.getRemark());
					contents.add(trContent);
				}
			}
		}
		
		//将模板生成的word转成pdf
		ConverPdfUtils.officeToPdf(wordFileName, wordConverPdfPath);
		File wordFile = new File(wordConverPdfPath);
		if (wordFile != null && wordFile.exists()) {
			inputStreams.add(0, new FileInputStream(wordFile));
		}
		
		//生成卷内文件目录word文件
		if (contents.size() > 0) {
			WordUtils.createDocContext(fileDirectoryPath, "卷内文件目录", "", widths, headTr, contents);
			//将卷内文件目录生成的word转成pdf
			ConverPdfUtils.officeToPdf(fileDirectoryPath, fileDirectoryPdfPath);
			File  rollInFile = new File(fileDirectoryPdfPath);
			if (rollInFile != null && rollInFile.exists()) {
				inputStreams.add(1, new FileInputStream(rollInFile));
			}
		}
		
		//将生成的pdf文件和文件夹中的pdf文件合并成一个pdf文件 并添加到压缩文件中
		//合并pdf
		MultiPdf2OneUtils.concatPDFs(inputStreams, outputStream, true);
		
		//将生成的word文件和文件夹再打包到最后指定的压缩文件中 最后将中间文件（word、文件夹及其下面的所有文件）删除
		ZipUtils.zip(wordFileName, lastZipDestPath, true, null);
		ZipUtils.zip(copyFilePath, lastZipDestPath, true, null);
		//将合成的pdf文件添加到压缩文件中
		ZipUtils.zip(mergePdfPath, lastZipDestPath, true, null);
		
		//删除检查表word文件和文件夹文件
		FileUtils.deleteFile(wordFileName);
		FileUtils.deleteDirectory(copyFilePath, true);
		if (contents.size() > 0) {
			//删除卷内文件目录生成的word文件
			FileUtils.deleteFile(fileDirectoryPath);
			//删除卷内文件目录生成的pdf文件
			FileUtils.deleteFile(fileDirectoryPdfPath);
		}
		//删除word转换的pdf文件
		FileUtils.deleteFile(wordConverPdfPath);
		//删除合并的pdf文件
		FileUtils.deleteFile(mergePdfPath);
//		return FileUtils.downFile(lastZipDestPath, checkModuleName+"-"+checkSubmoduleName+".zip");
		return FileUtils.downFile(lastZipDestPath, "检查相关文件.zip");
	}

}
